import router from '@/router'
import nprogress from 'nprogress'
import 'nprogress/nprogress.css'
import store from '@/store'

// 白名单
const whiteList = ['/login', '/404']

// 1. 路由前置导航守卫：主页鉴权，使用token和白名单，判断用户是否具有进入到主页的权限
// to：当前路由去哪儿 (路由规则对象)
// from：当前路由从哪儿来 (路由规则对象)
// next：是否放行当前路由，类型是函数。放行：next()；不放行，将路由拦截到某处：next('目标路径')
router.beforeEach(async(to, from, next) => {
  // 开启进度条
  nprogress.start()
  // 获取token
  const token = store.getters.token
  // 判断是否有token
  if (token) {
    // 有token，判断用户进入的是否是登录页
    if (to.path === '/login') {
      // 有token，进入登录页，被引导到主页
      next('/')
      // 经验：如果使用next('目标路径')，此时不会执行后置导航守卫，无法关闭进度条
      // 解决：手动关闭进度条
      nprogress.done()
    } else {
      // 有token，进入的不是登录页，横着走(想去哪儿就去哪儿)
      // 调用获取登录用户基本信息的action: 如果没有获取过资料，才调用
      if (!store.getters.userId) {
        // 调用获取登录用户基本信息的action
        // 注意点：dispatch是异步的，需求中必须保证先拿到用户基本信息，再跳转页面渲染
        await store.dispatch('user/getUserInfo')
      }

      next()
    }
  } else {
    // 无token
    // 继续判断路由是否在白名单，如果在就放行
    if (whiteList.includes(to.path)) {
      // 放行
      next()
    } else {
      // 既无token，也不是白名单，只能进登录页
      next('/login')
      nprogress.done()
    }

    // 注意点：一旦写了前置导航守卫，如果不写next()，路由会被拦截，页面是空白
    // next()
  }
})

// 2. 路由后置导航守卫
router.afterEach(() => {
  // 关闭进度条
  nprogress.done()
})
